package com.syx.migration.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author Administrator
 * @date 2024/6/5 11:13
 * @description: id创建
 */

public class TimeIdWorker {

    /**
     * 无创建时间生成
     */
    public static String createId(){
        return createId((String) null);
    }

    /**
     * 字符串创建时间生成
     * @param createTime 创建时间
     */
    public static String createId(String createTime){
        try {
            return createId(DateTimeUtils.str2Date(createTime));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 日期创建时间生成
     * @param createTime 创建时间
     */
    public static String createId(Date createTime){
        return createId(createTime, String.valueOf(new Random().nextInt(888888) + 111111));
    }

    /**
     * 携带key和时间生成
     * @param createTime 创建时间
     * @param suffix 尾序号
     */
    public static String createId(String createTime, Integer suffix){
        try {
            return createId(DateTimeUtils.str2Date(createTime), suffix);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 携带key和时间生成
     * @param createTime 创建时间
     * @param suffix 尾序号
     */
    public static String createId(Date createTime, Integer suffix){
        String strSuffix = String.valueOf(suffix);
        int suffixLength = String.valueOf(suffix).length();
        if (suffixLength >= 8){
            return createId(createTime, strSuffix);
        }
        // 生成指定长度随机数
        String rand = String.valueOf(new Random().nextInt(88888888) + 11111111);
        return createId(createTime, rand.substring(0, 8 - suffixLength) + strSuffix);
    }

    /**
     * id生成
     * @param createTime 创建时间
     *                   1. 没有创建时间：当前时间前五位（排序） + 当前时间后五位（区分） + 八位随机数
     *                   2. 有创建时间：创建时间的十位 + 八位随机数
     * @param rand 随机数 八位
     */
    public static String createId(Date createTime, String  rand){
        if (Objects.isNull(createTime)){
            String nowStr = String.valueOf(System.currentTimeMillis());
            String prev = nowStr.substring(0, 5);
            String suffix = nowStr.substring(nowStr.length() - 5);
            return prev + suffix + rand;
        }else{
            long times = createTime.getTime() / 1000;
            return times + rand;
        }
    }

}
